package com.controller;

import java.io.File;
import java.io.IOException;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;

/**
 * 文件上传和下载控制器类。
 * 提供文件上传和下载接口，支持上传不同类型的文件，返回文件路径。
 *
 * author: team10
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{

	@Autowired
	private ConfigService configService;

	/**
	 * 文件上传接口。
	 * 该接口用于上传文件到服务器的指定目录，并返回文件名。
	 *
	 * @param file 上传的文件
	 * @param type 文件类型，决定是否需要存储到特定的配置项中
	 * @return 上传结果，包括文件名
	 * @throws Exception 异常处理
	 */
	@RequestMapping("/upload")
	public R upload(@RequestParam("file") MultipartFile file, String type) throws Exception {
		// 判断上传的文件是否为空
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		// 获取文件的扩展名
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);

		// 获取当前类路径的文件路径
		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
		if (!path.exists()) {
			path = new File("");
		}

		// 设置上传目录
		File upload = new File(path.getAbsolutePath(), "/upload/");
		if (!upload.exists()) {
			upload.mkdirs(); // 创建文件夹
		}

		// 生成新的文件名
		String fileName = new Date().getTime() + "." + fileExt;
		File dest = new File(upload.getAbsolutePath() + "/" + fileName);

		// 将文件保存到目标路径
		file.transferTo(dest);

		// 如果文件类型为1，则更新faceFile的配置
		if (StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if (configEntity == null) {
				// 如果没有找到对应的配置，创建新的配置项
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				// 更新已有的配置项
				configEntity.setValue(fileName);
			}
			// 保存或更新配置
			configService.insertOrUpdate(configEntity);
		}

		// 返回上传结果，包括文件名
		return R.ok().put("file", fileName);
	}

	/**
	 * 文件下载接口。
	 * 该接口用于下载服务器上的文件。
	 *
	 * @param fileName 文件名
	 * @return 文件下载响应，包含文件数据
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
		try {
			// 获取当前类路径的文件路径
			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
			if (!path.exists()) {
				path = new File("");
			}

			// 设置上传目录
			File upload = new File(path.getAbsolutePath(), "/upload/");
			if (!upload.exists()) {
				upload.mkdirs(); // 创建文件夹
			}

			// 查找文件
			File file = new File(upload.getAbsolutePath() + "/" + fileName);
			if (file.exists()) {
				// 创建HTTP响应头，设置为附件下载类型
				HttpHeaders headers = new HttpHeaders();
				headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
				headers.setContentDispositionFormData("attachment", fileName);

				// 返回文件内容作为字节数组
				return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
			}
		} catch (IOException e) {
			// 捕获IO异常
			e.printStackTrace();
		}
		// 文件不存在或下载失败时返回500错误
		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
}
